//语法
async function fn(){  //表示异步,这个函数里有异步任务
	let str = await 'welcome'  //表示后边的结果需要等待
	return str
}
console.log(fn());  //Promise { <pending> }
fn().then(res=>{
	console.log('fn-res',res)   //welcome
})
//await只能放到async函数中
//相比promise语义化更强更简单
//await后面可以是promise对象，也可以是任何数据如数字，字符串，布尔值等
//实际上async返回的也是promise对象（promise的封装版）
//只要await后的状态变为reject(请求失败，类似promise)，整个异步程序就会中断
//所以await会将异步操作变为同步 阻塞模式 意思就是只有等待await方法后的内容执行完毕 才能执行await以下的任何操作
async function fn1(){  
	throw new Error('失败了')   //抛出错误
}
fn1().then(res=>{
	console.log('fn1-res',res)  
},err=>{
	console.log('fn1-err',err)   //fn1-err Error: 失败了
})
//或者用catch捕获失败
fn1().then(res=>{
	console.log('fn1-res',res)  
}).catch(err=>{
	console.log('fn1-catch-err',err)   //fn1-catch-err Error: 失败了
})
//抛出错误也可以用reject
async function fn2(){  
	await Promise.reject('出错了')
}
fn2().then(res=>{
	console.log('fn2-res',res)  
}).catch(err=>{
	console.log('fn2-catch-err',err)   //fn2-catch-err 出错了
})
//出错后中断后续异步程序
async function fn3(){  
	let a = await Promise.resolve('成功了1')
	return a
	await Promise.reject('出错了')
	let b = await Promise.resolve('成功了2')
	return [a,b]
}
fn3().then(res=>{
	console.log('fn3-res',res)   //fn3-res '成功了1'
}).catch(err=>{
	console.log('fn3-catch-err',err)   //fn3-catch-err 出错了
})
//如果不想在出错时中断后续异步程序
//1.用try{}catch{}
async function fn4(){
	let a = await Promise.resolve('成功了1')
	try{
		await Promise.reject('出错了')
	}catch(e){
	}
	let b = await Promise.resolve('成功了2')
	return [a,b]
}
fn4().then(res=>{
	console.log('fn4-res',res)   //fn4-res [ '成功了1', '成功了2' ]
})
//2.用promise自带的catch
async function fn5(){
	let a = await Promise.resolve('成功了1')
	await Promise.reject('出错了').catch(err=>{
		console.log('fn5-err',err)  //fn5-err 出错了
	})
	let b = await Promise.resolve('成功了2')
	return [a,b]
}
fn5().then(res=>{
	console.log('fn5-res',res)   //fn5-res [ '成功了1', '成功了2' ]
})
//任何跟网路打交道的请求都不保险，所以async函数中的任何一项异步操作都有可能失败
//只要有一项失败就会导致后续操作瘫痪
//所以一般使用async函数都如下操作:统一使用Promise.all([])
async function fn6(){
	let [a,b,c] = await Promise.all([
		await '成功了a',
		new Error('失败了b'), 
		await '成功了c',
	])
	return [a,b,c]
}
fn6().then(res=>{
	console.log('fn6-res',res)   //fn6-res [ '成功了a', Error: 失败了b, '成功了c' ]
})
/*.catch(err=>{
	console.log('fn6-err',err)  //不执行
})*/


// 经典用法
let events = async ()=>{
	try{
		let data = await getEvents()
		
	}catch(e){
		
	}
}

// sleep
const sleep = ms => {
	return new Promise(resolve=>{
		setTimeout(resolve,ms)
	})
}

// 如下aaa与bbb等同
async function aaa(){
	await sleep(3000)
	return Promise.resolve('ok')
}

async function bbb(){
	await sleep(3000)
	return 'ok'
}